package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
)

// 打开文件
func main() {
	fileObj, err := os.Open("./31.文件操作.go")
	if err != nil {
		fmt.Println("文件打开失败", err)
		return
	}

	fmt.Println("文件打开成功", fileObj)
	// 记得关闭文件
	defer fileObj.Close()
	// 读取文件
	//var tmp = [128]byte
	var tmp = make([]byte, 128)
	for {
		n, err := fileObj.Read(tmp[:])
		if err == io.EOF {
			fmt.Println("文件读取完成", n)
			return
		}
		if err != nil {
			fmt.Println("文件读取失败", err)
			return
		}
		fmt.Println("文件读取成功", n)
		fmt.Println(string(tmp[:n]))
		if n < 128 {
			fmt.Println("文件读取完成", n)
			return
		}
	}
	readFromFilebyBufio()
}

// 利用bufio这个包读取文件

func readFromFilebyBufio() {
	fileObj, err := os.Open("./31.文件操作.go")
	if err != nil {
		fmt.Println("文件打开失败", err)
		return
	}

	fmt.Println("文件打开成功", fileObj)
	// 记得关闭文件
	defer fileObj.Close()
	// 创建一个用来从文件中读取内容的对象
	reader := bufio.NewReader(fileObj)
	for {
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			fmt.Println("文件读取完成", line)
			return
		}
		if err != nil {
			fmt.Println("文件读取失败", err)
			return
		}
		fmt.Println("文件读取完成", line)
	}

}

// readFromFilebyIoutil
func readFromFilebyIoutil() {
	fileObj, err := ioutil.ReadFile("./31.文件操作.go")
	if err != nil {
		fmt.Println("文件打开失败", err)
		return
	}

	fmt.Println("文件打开成功", string(fileObj))

}

func init() {
	fileWrite()
}

// 文件写入

func fileWrite() {
	FILEOBJ, err := os.OpenFile("./xx.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) // 0644 这是8进制数
	if err != nil {
		fmt.Println(err)
		return
	}

	FILEOBJ.Write([]byte("341322\n34234"))

	defer FILEOBJ.Close()
	// bufio写入
	writer := bufio.NewWriter(FILEOBJ)
	for i := 0; i < 3; i++ {
		writer.WriteString("你好\n") // 先将数据写入缓存中
	}
	writer.Flush() // 将数据写入文件
	// ioutil写入
	str := "hahahahha"
	errs := ioutil.WriteFile("./xx.txt", []byte(str), 0666)
	if err != nil {
		fmt.Println(errs)
		return
	}
}
